package Servidor;

import java.net.*;
import java.io.*;

public class Rx implements Runnable {
	private int puerto = 15001;
	Socket socket;
	private ObjectInputStream objectInputStream;
	private ObjectOutputStream objectOutputStream;

	/**
	 * @brief Constructor predeterminado
	 */
	public Rx() {
		Thread hilo = new Thread(this);
		hilo.setName("Receptor");
		hilo.start();
	}

	/**
	 * @brief Constructor que especifica un puerto determinado.
	 * @param puerto
	 */
	public Rx(int puerto) {
		this.puerto = puerto;
		Thread hilo = new Thread(this);
		hilo.setName("Receptor");
		hilo.start();
	}

	/**
	 * @brief Porcion de codigo a ejecutar continuamiente.
	 */
	public void run() {
		iniciarConexion();
		while (true) {
			try {
				Thread.sleep(250);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @brief Metodo que inicia la conexion con el servidor y crea los input
	 *        Streams para recibir Objetos.
	 */
	private void iniciarConexion() {
		try {
			System.out
					.println("Servidor: Iniciando conexion con el radar (puerto: "
							+ puerto + ")");
			socket = new Socket("localhost", puerto);

			// Generar los Streams de datos de entradas necesarios
			InputStream inputStream = socket.getInputStream();
			OutputStream outputStream = socket.getOutputStream();

			// Aca esta lo imporante. Crear un streams de OBJETOS
			// serializables!!
			objectInputStream = new ObjectInputStream(inputStream);
			objectOutputStream = new ObjectOutputStream(outputStream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @brief Metodo para probar enviar cosas (hasta ahora, no se usa)
	 */
	public void enviarObjeto() {
		try {
			objectOutputStream.writeObject("Un String");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @brief Metodo que recibe un objeto
	 */
	public Object recibirObjeto() {
		Object objeto = null;
		try {
			objeto = objectInputStream.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return objeto;
	}

}
